69,393
社区成员
发帖
与我相关
我的任务
分享
//查找中序遍历下x结点的后继,后继是大于key[x]的最小的结点
node *Tree_Successor(node *x)
{
//如果有右孩子
if(x->right != NULL)
//右子树中的最小值
return Tree_Minimum(x->right);
//如果x的右子树为空且x有后继y,那么y是x的最低祖先结点,且y的左儿子也是
node *y = x->p;
while(y != NULL && x == y->right)
{
x = y;
y = y->p;
}
return y;
}
//查找二叉查找树中节点x的前驱节点,返回指向该节点的指针
//在查找过程中,如果节点x左子树不为空,那么返回左子树的最大节点即可
//如果节点x的左子树为空,那么前驱节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的右儿子
Tree tree_predecessor(Tree x)
{
if (x->left_child != null)
return tree_maxmum(x->left_child);
Tree y = x->parent;
while (y != NULL && x == y->left_child)
{
x = y;
y = y->parent;
}
return y;
}